import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import { WinstonModule } from 'nest-winston';
import cookieParser from 'cookie-parser';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
import { ResponseInterceptor } from './common/interceptors/response.interceptor';
import { winstonConfig } from './config/logger.config';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule, {
    // 使用 Winston 日志系统
    logger: WinstonModule.createLogger(winstonConfig),
    bodyParser: true,
  });

  // 配置静态文件服务，用于访问上传的文件
  app.useStaticAssets(join(process.cwd(), 'uploads'), {
    prefix: '/uploads/',
  });

  // 启用 Cookie 解析（用于 Refresh Token）
  app.use(cookieParser());

  // 注意：multipart/form-data 需要在使用 FileInterceptor 的地方单独处理
  // 对于普通表单数据，NestJS 会自动解析到 req.body

  // 全局启用验证管道
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true, // 自动移除未装饰的属性，防止未知字段
      forbidNonWhitelisted: true, // 禁止未定义的属性，提供更严格的验证
      transform: true, // 自动转换类型
      transformOptions: {
        enableImplicitConversion: true, // 启用隐式类型转换
      },
      // 使用默认的异常工厂，自动格式化错误消息
    }),
  );

  // 全局启用异常过滤器
  app.useGlobalFilters(new HttpExceptionFilter());

  // 全局启用响应拦截器
  app.useGlobalInterceptors(new ResponseInterceptor());

  const port = process.env.PORT ?? 3000;
  await app.listen(port);
  console.log(`🚀 应用已启动: http://localhost:${port}`);
}

void bootstrap().catch((error) => {
  console.error('启动应用失败:', error);
  process.exit(1);
});
